﻿package igz.fleaxy.ui.tab 
{
	import flash.display.Sprite;
	import igz.fleaxy.pattern.AbstractFactory;
	import igz.fleaxy.pattern.Dto;
	import igz.fleaxy.ui.text.LabelUi;

	/**
	 * @author Intelygenz | www.intelygenz.com
	 * 
	 * Tab abstracto que se ocupa de gestionar un UI basado en tabs. Tiene, entre otras cosas, un TabItemUi y un contenedor donde 
	 * están los elementos del tab. Esta clase se extenderá dependiendo de lo que necesite posteriormente creando un customTabUi
	 * 
	 * //TODO revisar
	 */
	public class AbstractTabUi extends Sprite {

		protected var _TabDataColNames:Object = { ID : "$Id" };
		
		protected var _TabItemSelected:AbstractTabItemUi;
		protected var _TabsItemUi:Object;
		
		protected var _ListSort:Array;
		
		protected var _ContainerUi:Sprite;
		protected var _ItemType:Class;

		
		/**
		 * Inicializa y declara el tipo  de los elementos del TabUi
		 * @param	p_itemType Tipo que se le da a los elementos del TabUi
		 */
		public function AbstractTabUi( p_itemType:Class ) {
			_TabsItemUi  = new Object();
			_ListSort 	 = new Array();
			_ContainerUi = new Sprite();
			
			_ItemType    = p_itemType;
			addChild( _ContainerUi );
		}
		
		protected function _Load( p_tabManager: AbstractFactory ):void {
			for each ( var tabDto:Dto in p_tabManager.$Dtos ) {
				_Add( tabDto, _ItemType );
			}
		}

		protected function _Add( p_tabDto:Dto, p_tabItemType:Class ) : AbstractTabItemUi {
			var newTabItemUi : AbstractTabItemUi = null;
			
			if ( !_TabsItemUi.hasOwnProperty( p_tabDto[_TabDataColNames["ID"]]) ) {
				newTabItemUi = new p_tabItemType( this, p_tabDto );
				_TabsItemUi[ p_tabDto[_TabDataColNames["ID"]] ] = newTabItemUi;
				_ListSort.push( newTabItemUi );
			}
			
			return newTabItemUi;
		}
	
		protected function _Remove ( p_tabDto:Dto ) : void {
			var indexItem:uint = _ListSort.indexOf( _TabsItemUi[ p_tabDto[_TabDataColNames["ID"]]], 0 );
			_ListSort.splice( indexItem, 1  );

			_TabsItemUi[ p_tabDto[_TabDataColNames["ID"]] ] = null;
		}
		
		protected function _Select( p_optionId:uint ) : void {
			if ( _TabsItemUi[p_optionId] != null ) {
				if ( _TabItemSelected != null ) {
					_TabItemSelected.$Unselect();
				}
				_TabItemSelected = _TabsItemUi[p_optionId];
				_TabItemSelected.$Select();
			}
		}
		
		public function $Enable () : void {
			var abstractTabItemUi : AbstractTabItemUi;
			for each( abstractTabItemUi in _TabsItemUi ) {
				abstractTabItemUi.$Enable();
			}
		}
		
		public function $Disable () : void {
			var abstractTabItemUi : AbstractTabItemUi;
			for each( abstractTabItemUi in _TabsItemUi ) {
				abstractTabItemUi.$Disable();
			}
		}
		
	}
	
}